﻿using System;
using System.IO;
using System.Data;
using System.Windows;
using System.Collections;
using System.Windows.Input;
using System.ComponentModel;
using System.Windows.Controls;
using Sinacor.Infra.UI.Common;
using Sinacor.Infra.UI.Controls;
using Sinacor.Infra.UI.Controls.SmartClient;
using System.Collections.Generic;
using Sinacor.Infra.UI.Controls.SmartClient.Validation;

namespace Sinacor.UI.Bovespa.Clientes.View.SmartClient
{
    public partial class CadastroRelacionamentoBroker : SinacorWindow, Presenter.IRelacionamentoBroker
    {
        #region Atributos

        private Presenter.RelacionamentoBroker _presenterRelacionamentoBroker = null;

        #endregion

        #region Construtores

        public CadastroRelacionamentoBroker()
        {
            InitializeComponent();

            _presenterRelacionamentoBroker = new Presenter.RelacionamentoBroker(this);

            this.DataContext = PresenterRelacionamentoBroker;

            DtgRelacionamentoBroker.NewItemType = typeof(Model.RelacionamentoBroker);

            this.AfterInitialize += new RoutedEventHandler(CadastroRelacionamentoBroker_AfterInitialize);
            DtgRelacionamentoBroker.EndingInsert += new CancelItemEventHandler(DtgRelacionamentoBroker_EndingInsert);
            DtgRelacionamentoBroker.EndingUpdate += new CancelItemEventHandler(DtgRelacionamentoBroker_EndingUpdate);
            DtgRelacionamentoBroker.Deleting += new CancelItemsEventHandler(DtgRelacionamentoBroker_Deleting);
            DtgRelacionamentoBroker.Inserted += new ItemEventHandler(DtgRelacionamentoBroker_Inserted);
            DtgRelacionamentoBroker.Updated += new ItemEventHandler(DtgRelacionamentoBroker_Updated);
            DtgRelacionamentoBroker.Deleted += new ItemsEventHandler(DtgRelacionamentoBroker_Deleted);
            DtgRelacionamentoBroker.CancelingInsert += new CancelItemEventHandler(DtgRelacionamentoBroker_CancelingInsert);
            DtgRelacionamentoBroker.CancelingUpdate += new CancelItemEventHandler(DtgRelacionamentoBroker_CancelingUpdate);
        }

        #endregion

        #region Propriedades

        public Presenter.RelacionamentoBroker PresenterRelacionamentoBroker
        {
            get { return _presenterRelacionamentoBroker; }
            set { _presenterRelacionamentoBroker = value; }
        }

        #endregion

        #region Event Handlers

        private void CadastroRelacionamentoBroker_AfterInitialize(object sender, RoutedEventArgs e)
        {
            AtualizarRelacionamentos();
        }

        private void DtgRelacionamentoBroker_Deleting(object sender, CancelItemsEventArgs e)
        {
            if (e.OriginalSource is SinacorDataGrid)
            {
                if (SinacorMessageBox.Show(this.FindResource("Bovespa.Clientes.Message.ExcluirRelacionamento").ToString(),
                                  SinacorMessageBoxButton.YesNo,
                                  SinacorMessageBoxImage.Information) == SinacorMessageBoxResult.Yes)
                {
                    try
                    {
                        this.ClearServiceErrors();

                        ShowUserWaitingProcess();

                        e.Cancel = !_presenterRelacionamentoBroker.ExcluirRelacionamentoBroker(DtgRelacionamentoBroker.SelectedItem as Model.RelacionamentoBroker);
                    }
                    finally
                    {
                        HideUserWaitingProcess();
                    }
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

        private void DtgRelacionamentoBroker_EndingUpdate(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                try
                {
                    this.ClearServiceErrors();
                    ShowUserWaitingProcess();

                    e.Cancel = !_presenterRelacionamentoBroker.AlterarRelacionamentoBroker(DtgRelacionamentoBroker.EditItem as Model.RelacionamentoBroker);
                }
                finally
                {
                    HideUserWaitingProcess();
                }
            }
        }

        private void DtgRelacionamentoBroker_EndingInsert(object sender, CancelItemEventArgs e)
        {
            if (e.OriginalSource is BaseRow)
            {
                try
                {
                    this.ClearServiceErrors();
                    ShowUserWaitingProcess();

                    e.Cancel = !_presenterRelacionamentoBroker.IncluirRelacionamentoBroker(DtgRelacionamentoBroker.EditItem as Model.RelacionamentoBroker);
                }
                finally
                {
                    HideUserWaitingProcess();
                }
            }
        }

        private void DtgRelacionamentoBroker_Deleted(object sender, ItemsEventArgs e)
        {
            AtualizarRelacionamentos();
        }

        private void DtgRelacionamentoBroker_Updated(object sender, ItemEventArgs e)
        {
            AtualizarRelacionamentos();
        }

        private void DtgRelacionamentoBroker_Inserted(object sender, ItemEventArgs e)
        {
            AtualizarRelacionamentos();
        }

        private void DtgRelacionamentoBroker_CancelingUpdate(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
        }

        private void DtgRelacionamentoBroker_CancelingInsert(object sender, CancelItemEventArgs e)
        {
            this.ClearServiceErrors();
        }

        private void TxtApelidoBrokerPrincipal_Validating(object sender, ValidatingEventArgs e)
        {
            ValidationResult result = ValidationResult.ValidResult;
            Model.RelacionamentoBroker broker = (Model.RelacionamentoBroker)DtgRelacionamentoBroker.EditItem;
            int codigoBroker;

            //Verifica se o campo está vazio
            if (e.Value != null 
                && !String.IsNullOrEmpty(e.Value.ToString()))
            {
                //Verifica se cliente existe
                if (_presenterRelacionamentoBroker.ObterCliente(e.Value.ToString(), out codigoBroker))
                {
                    broker.CodigoBrokerPrincipal = codigoBroker;
                }
                else
                {
                    result = new ValidationResult(false, "Bovespa.Clientes.Message.ClienteInexistente");
                }
            }
            else
            {
                broker.CodigoBrokerPrincipal = null;
            }

            e.Result = result;
        }

        private void TxtApelidoBrokerIntermediario_Validating(object sender, ValidatingEventArgs e)
        {
            ValidationResult result = ValidationResult.ValidResult;
            Model.RelacionamentoBroker broker = (Model.RelacionamentoBroker)DtgRelacionamentoBroker.EditItem;
            int codigoBroker;

            //Verifica se o campo está vazio
            if (e.Value != null
                && !String.IsNullOrEmpty(e.Value.ToString()))
            {
                //Verifica se cliente existe
                if (_presenterRelacionamentoBroker.ObterCliente(e.Value.ToString(), out codigoBroker))
                {
                    broker.CodigoBrokerIntermediario = codigoBroker;
                }
                else
                {
                    result = new ValidationResult(false, "Bovespa.Clientes.Message.ClienteInexistente");
                }
            }
            else
            {
                broker.CodigoBrokerIntermediario = null;
            }

            e.Result = result;
        }

        #endregion

        #region Métodos Privados

        private void AtualizarRelacionamentos()
        {
            try
            {
                ShowUserWaitingProcess();

                _presenterRelacionamentoBroker.ConsultarRelacionamentosBroker();
            }
            finally
            {
                HideUserWaitingProcess();
            }
        }

        #endregion

        #region IRelacionamentoBroker Members

        public void AtualizarListaRelacionamentosBroker()
        {
            DtgRelacionamentoBroker.UpdateTarget(SinacorDataGrid.ItemsSourceProperty);
        }

        public void InformarSucessoOperacao()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Clientes.Message.SucessoOperacao").ToString(),
                                   SinacorMessageBoxButton.Ok,
                                   SinacorMessageBoxImage.Information);
        }

        public void InformarPesquisaSemResultado()
        {
            SinacorMessageBox.Show(this.FindResource("Bovespa.Clientes.Message.RegistroNaoEncontrado").ToString(),
                                   SinacorMessageBoxButton.Ok,
                                   SinacorMessageBoxImage.Exclamation);
        }

        #endregion
    }
}